﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorDeFlotasDesktop.UILogic;
using GestorDeFlotasModelo.Entities;
using GestorDeFlotasModelo.Factorias;
using GestorDeFlotasDesktop.UILogic.Helpers;
using Persistencia;
using GestorDeFlotasDesktop.AbmTurno;

namespace GestorDeFlotasDesktop.AbmTarifa
{
    public partial class AbmTarifa : BaseForm
    {
        public AbmTarifa()
        {
            InitializeComponent();
            
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            base.OnClosing(e);
            if(Transaccion != null)
                Transaccion.Persistir();
        }

        protected override void OnVisibleChanged(EventArgs e)
        {
            
            base.OnVisibleChanged(e);
            btnDeshabilitar.Visible = false;
            btnHabilitar.Visible = false;
            dgvTurno.SelectionChanged += new EventHandler(dgvTurno_SelectionChanged);
            GridCreation();
            this.CargarTurnos();
        }

        void dgvTurno_SelectionChanged(object sender, EventArgs e)
        {
            if (dgvTurno.SelectedRows.Count > 0)
                if (((Turno)dgvTurno.SelectedRows[0].DataBoundItem).Habilitado)
                {
                    btnDeshabilitar.Visible = true;
                    btnHabilitar.Visible = false;
                }
                else
                {
                    btnDeshabilitar.Visible = false;
                    btnHabilitar.Visible = true;
                }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.CargarTurnos();
        }

        public void CargarTurnos()
        {
            List<Turno> turnos = Transaccion.Factoria<FactoriaTurno>().SelectTurno(textBox1.Text);
            SetGridData(turnos);
        }

        private void GridCreation()
        {
            dgvTurno.Columns.Clear();
            dgvTurno.ReadOnly = true;
            dgvTurno.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dgvTurno.AutoGenerateColumns = false;
            dgvTurno.MultiSelect = false;
            dgvTurno.Columns.Add(DataGridViewHelpers.CreateDataGridViewTextBoxColumn("Id", "Id", false));
            dgvTurno.Columns.Add(DataGridViewHelpers.CreateDataGridViewTextBoxColumn("Descripcion", "Descripcion"));
            dgvTurno.Columns.Add(DataGridViewHelpers.CreateDataGridViewTextBoxColumn("HoraInicio", "Hora Inicio"));
            dgvTurno.Columns.Add(DataGridViewHelpers.CreateDataGridViewTextBoxColumn("HoraFin", "Hora Fin"));
            dgvTurno.Columns.Add(DataGridViewHelpers.CreateDataGridViewTextBoxColumn("ValorBandera", "Valor Bajada de Bandera"));
            dgvTurno.Columns.Add(DataGridViewHelpers.CreateDataGridViewTextBoxColumn("ValorFicha", "Valor de Ficha"));
            dgvTurno.Columns.Add(DataGridViewHelpers.CreateDataGridViewCheckBoxColumn("Habilitado", "Habilitado"));
        }
        private void SetGridData(List<Turno> turnos)
        {
            if (turnos != null && turnos.Count > 0)
            {
                dgvTurno.DataSource = turnos;
                dgvTurno.Visible = true;
                lblNoItems.Visible = false;

            }
            else
            {
                lblNoItems.Visible = true;
                dgvTurno.Visible = false;
            }
        }

        private void btnHabilitar_Click(object sender, EventArgs e)
        {
            if (dgvTurno.SelectedRows.Count > 0)
            {
                Turno t = ((Turno)dgvTurno.SelectedRows[0].DataBoundItem);
                t.Habilitado = true;
                Transaccion.Factoria<FactoriaTurno>().Suplantar(t);
            }
            else
            {
                MessageBox.Show("Debe seleccionar un Turno para habilitar.");
            }
            this.CargarTurnos();
        }

        private void btnDeshabilitar_Click(object sender, EventArgs e)
        {
            if (dgvTurno.SelectedRows.Count > 0)
            {
                Turno t = ((Turno)dgvTurno.SelectedRows[0].DataBoundItem);
                t.Habilitado = false;
                Transaccion.Factoria<FactoriaTurno>().Suplantar(t);
            }
            else
            {
                MessageBox.Show("Debe seleccionar un Turno para deshabilitar.");
            }
            this.CargarTurnos();
        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            FormularioTurno ftu = new FormularioTurno(this.Transaccion,((Turno)dgvTurno.SelectedRows[0].DataBoundItem),this);
            ftu.Show();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                this.ValidarTurnos();
                this.Transaccion.Persistir();
                MessageBox.Show("Los cambios han sido guardados!");
             
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void ValidarTurnos()
        {
            List<Turno> turnos = Transaccion.Factoria<FactoriaTurno>().SelectTodos<Turno>();
            List<Turno> turnosValidos = new List<Turno>();
            bool validos=turnos.All<Turno>(delegate(Turno t)
            {
                if (!t.Habilitado)
                    return true;
                else
                    if (!turnosValidos.Exists(delegate(Turno tValido)
                    {
                        return SePisan(t, tValido);
                    }))
            
                    {
                        turnosValidos.Add(t);
                        return true;
                    }

                return false;

            });


            if (!validos)
                throw new Exception("Hay turnos invalidos!, verifique que no se pisen los horarios de los turnos");

            int horas = 0;
            turnosValidos.ForEach(delegate(Turno t)
            {
                if (t.HoraFin - t.HoraInicio > 0)
                    horas += (t.HoraFin - t.HoraInicio);
                else
                    horas += 24 + (t.HoraFin - t.HoraInicio);
            });

            if(horas != 24)
                throw new Exception("Hay turnos invalidos!, los turnos habilitados deben ocupar toda la franja horaria.");

        }

        private bool SePisan(Turno t, Turno tValido)
        {
            if (tValido.HoraFin > t.HoraInicio && t.HoraInicio > tValido.HoraInicio)
                return true;

            if (t.HoraFin > tValido.HoraInicio && tValido.HoraInicio > t.HoraInicio)
                return true;

            return false;

        }

        private void btnCrear_Click(object sender, EventArgs e)
        {
            FormularioTurno ftu = new FormularioTurno(this.Transaccion,this);
            ftu.Show();
        }

        private void AbmTarifa_Load(object sender, EventArgs e)
        {

        }
    }
}
